home *** CD-ROM | disk | FTP | other *** search
/ Free Software Collection: Marty 1 / FM Towns Marty 1 Free Software Collection.iso / tool / book / src / init.c < prev    next >
C/C++ Source or Header  |  1993-11-11  |  10KB  |  327 lines

  1. /*
  2.  *  初期化に使うルーチン
  3.  
  4.  *  char *param(char *path)
  5.  *          パラメータがパスリストだったら、そのディレクトリに移動する
  6.  *  void configuration(char *fname)
  7.  *          定義ファイルを読み、定義値を変数にセットする
  8. */
  9.  
  10. #include    <stdio.h>
  11. #include    <stdlib.h>
  12. #include    <string.h>
  13. #include    <ctype.h>
  14. #include    <egb.h>
  15. #include    <mos.h>
  16. #include    <fmc.h>
  17. #include    "menu_evt.h"
  18. #include    "init.h"
  19. #include    "book.h"
  20. #include    "lib.h"
  21. #include    "doslib.h"
  22.  
  23.  
  24. setup_t setup =     /* セットアップ情報 */
  25. {
  26.     NULL,       /* char       *onsei_dic;   : ONSEI.DIC のパス */
  27.                 /* paltbl_t    palette;     : 画面の色情報 */
  28.     { 8, { 10, 255,255,255 }, { 9, 255,  0,255 }, { 8,  31, 31, 31 },
  29.          { 11,   0,255,255 }, { 2, 255,255,255 }, { 3,  63, 63, 63 },
  30.          { 1,    0,  0,  0 }, {13,   0,127,  0 }, {14, 127,127,  0 }},
  31.  
  32.   /* ファイルセレクタ */
  33.     SORT_NAME,  /* SORT        sort_mode;   : ソート方式 */
  34.     1,          /* short       fs_mode;     : 段組表示数 */
  35.  
  36.   /* テキスト表示 */
  37.     TAB_DEF,    /* short       tabsiz;      : ハード・タブ間隔 */
  38.     TRUE,       /* short       disp_cr;     : 改行記号の表示有無 */
  39.     TRUE,       /* short       disp_ctrl;   : 制御文字を可視化する */
  40.     0,          /* short       dpl_mode;    : 行間隔モード */
  41.     32,         /* short       btn_speed;   : 定速スクロールボタンの速度 */
  42.     FALSE,      /* short       caps;        : 検索時英大小文字区別 */
  43.  
  44.   /* リピート時間 */
  45.     20,         /* short       repstart;    : キーリピート開始時間 (1=20ms) */
  46.      1,         /* short       repeat;      : キーリピート間隔     (1=20ms) */
  47.     20,         /* short       db_click;    : ダブルクリック検出   (1=20ms) */
  48. };
  49.  
  50.  
  51. /*  config ファイルの読み込み  */
  52.  
  53. typedef enum  {prm_DIGIT, prm_STRING, prm_MULTI} ptype_t;
  54. typedef enum  {cmd_tabsize, cmd_dispcr, cmd_ctrl,
  55.                 cmd_backpal, cmd_textpal, cmd_crpal, cmd_ctrlpal,
  56.                 cmd_sortkey, cmd_wildc, cmd_onsei, cmd_excmd,
  57.                 cmd_dpl, cmd_btn, cmd_caps, cmd_fsmode,
  58.                 cmd_end} cmd_t;
  59. typedef struct
  60. {
  61.     cmd_t   code;
  62.     char    *cmd;
  63.     ptype_t ptype;
  64. }   param_t;
  65.  
  66. static  const   param_t prm[] =
  67. {
  68.     cmd_tabsize,"TAB_SIZE",     prm_DIGIT,  /*  タブサイズ      */
  69.     cmd_dispcr, "DISP_CR",      prm_DIGIT,  /*  改行表示        */
  70.     cmd_ctrl,   "FORM_CTRL",    prm_DIGIT,  /*  制御文字整形    */
  71.     cmd_dpl,    "DOT/LINE",     prm_DIGIT,  /*  行間隔          */
  72.     cmd_btn,    "BTN_SPEED",    prm_DIGIT,  /*  定速ボタンの速度  */
  73.     cmd_caps,   "CAPS",         prm_DIGIT,  /*  英大小文字区別  */
  74.     cmd_onsei,  "ONSEI",        prm_STRING, /*  ONSEI.DICのパス */
  75.  
  76.     cmd_sortkey,"SORT_KEY",     prm_DIGIT,  /*  ソートキー      */
  77.     cmd_wildc,  "WILD_CARD",    prm_STRING, /*  追加ワイルド・カード */
  78.     cmd_fsmode, "FS_MODE",      prm_DIGIT,  /*  ファイルセレクタの段組み  */
  79.  
  80.     cmd_excmd,  "DOS_CMD",      prm_STRING, /*  外部コマンド起動  */
  81.  
  82.     cmd_backpal,"BACK_PAL",     prm_MULTI,  /*  背景色 B,R,G    */
  83.     cmd_textpal,"TEXT_PAL",     prm_MULTI,  /*  文字色 B,R,G    */
  84.     cmd_crpal,  "CR_PAL",       prm_MULTI,  /*  改行色 B,R,G    */
  85.     cmd_ctrlpal,"CTRL_PAL",     prm_MULTI,  /*  制御色 B,R,G    */
  86.  
  87.     cmd_end,    NULL,           prm_DIGIT,  /*  終わり  */
  88. } ;
  89.  
  90. static  param_t *search_cmd(char *cmd_str)
  91. {
  92. param_t *pp;
  93. char    *cmd = strdup(cmd_str);
  94.  
  95.     jstrupr(cmd);
  96.  
  97.     for (pp = (param_t *)&prm; pp->cmd != NULL; pp++)
  98.         if (strcmp(cmd, pp->cmd) == 0)
  99.             break;
  100.  
  101.     free(cmd);
  102.  
  103.     return pp;
  104. }
  105.  
  106.  
  107. static  char    *param_ptr = NULL;
  108. #define prm_setpos(a) (param_ptr = a)
  109.  
  110. static  int     getvalue(int default_value)
  111. {
  112. int     return_value;
  113.  
  114.     if (param_ptr == NULL || *param_ptr == '\0' || !isdigit(*param_ptr))
  115.         return_value = default_value;
  116.     else
  117.     {
  118.         return_value = atoi(param_ptr);
  119.         while (*param_ptr &&  isdigit(*param_ptr)) param_ptr++;
  120.         while (*param_ptr && !isdigit(*param_ptr)) param_ptr++;
  121.     }
  122.     return return_value;
  123. }
  124. static  void    cnv_palette(pal_t *pal)
  125. {
  126.     pal->b = getvalue(pal->b);
  127.     pal->r = getvalue(pal->r);
  128.     pal->g = getvalue(pal->g);
  129. }
  130.  
  131.  
  132. #define MAX_LINE_LEN 2048   /*  継続行の最大長  */
  133.  
  134. void    configuration(char *fname)
  135. {
  136. FILE    *fp;
  137. char    buf[MAX_LINE_LEN+1];
  138. char    *p, *prm1, *prm2;
  139. int     tmp;
  140. param_t *cmd;
  141.  
  142.     int     fileread(FILE *fp, char *buf, int maxlen)
  143.     {
  144.     char    *p, filebuf[256];
  145.     int     len, all_len=0;
  146.  
  147.         *buf = '\0', all_len = 0;
  148.         while (TRUE)
  149.         {
  150.             fgets(filebuf, 255, fp);
  151.             if (feof(fp))
  152.                 break;
  153.             if ((len = strlen(filebuf)) < 2)
  154.                 break;
  155.             len--;
  156.             *(filebuf+len) = '\0';      /* 改行をつぶす */
  157.             if (all_len + len > maxlen)
  158.                 break;
  159.             _strcats(maxlen, buf, " ", skipbl(filebuf), NULL);
  160.             all_len = strlen(buf);
  161.             if (*(p = buf+all_len-1) != '\\')  /* 継続行 */
  162.                 break;
  163.             *p = '\0';
  164.         }
  165.         return feof(fp);
  166.     }
  167.  
  168.     if ((fp = fopen(fname, "r")) == NULL)
  169.         return;
  170.  
  171.     while (!fileread(fp, buf, MAX_LINE_LEN))
  172.     {
  173.         prm1 = skipbl(buf);                 /*  第一パラメータの頭だし  */
  174.         if (*prm1 == '\0' || *prm1 == '#')  /*  注釈か空行ならスキップ  */
  175.             continue;                       /*  ならば、パス            */
  176.  
  177.         prm2 = skipbl(skipwd(prm1));        /*  第二パラメータの頭だし  */
  178.         if (*prm2 == '\0' || *prm2 == '#')  /*  第二パラメータ以降なし  */
  179.             continue;                       /*  ならば、パス            */
  180.  
  181.         *(skipwd(prm1)) = '\0';             /*  第一パラメータの終端セット  */
  182.         cmd = search_cmd(prm1);             /*  コマンド?  */
  183.         if (cmd->cmd == NULL)               /*  違うならパス  */
  184.             continue;
  185.  
  186.         switch(cmd->ptype)                  /*  第二パラメータを検査  */
  187.         {
  188.           case prm_MULTI:                   /*  複数 数値型  */
  189.             prm_setpos(prm2);
  190.           case prm_DIGIT:                   /*  数値型  */
  191.             if (!isdigit(*prm2))            /*  第二パラメータは数値?  */
  192.                 continue;                   /*    違ったら、パス  */
  193.             else
  194.                 tmp = atoi(prm2);           /*  第二パラメータを数値変換  */
  195.             break;
  196.  
  197.           case prm_STRING:                  /*  文字型  */
  198.             break;
  199.         }
  200.  
  201.  
  202.         /*  コマンドに応じた処理  */
  203.  
  204.         switch(cmd->code)
  205.         {
  206.           case cmd_tabsize:     /*  タブサイズ  */
  207.             if (tmp==0 || tmp==1 || tmp==4 || tmp==8)
  208.                 setup.tabsiz = tmp;
  209.             break;
  210.  
  211.           case cmd_dispcr:      /*  改行記号の表示  */
  212.             if (tmp == 0 || tmp == 1)
  213.                 setup.disp_cr = tmp;
  214.             break;
  215.  
  216.           case cmd_ctrl:        /*  制御文字の整形表示  */
  217.             if (tmp == 0 || tmp == 1)
  218.                 setup.disp_ctrl = tmp;
  219.             break;
  220.  
  221.           case cmd_sortkey:     /*  ソートキーの指定  */
  222.             if (tmp == 0 || tmp == 1 || tmp == 2)
  223.                 setup.sort_mode = tmp;
  224.             break;
  225.  
  226.           case cmd_wildc:       /*  追加ワイルドカード  */
  227.             *(skipwd(prm2)) = '\0';     /*  第二パラメータの終端セット  */
  228.             wc_apend(prm2, FALSE);
  229.             break;
  230.  
  231.           case cmd_fsmode:      /*  ファイルセレクタの段組み  */
  232.             if (tmp == 1 || tmp == 2)
  233.                 setup.fs_mode = tmp;
  234.             break;
  235.  
  236.           case cmd_dpl:         /*  行間隔  */
  237.             if (tmp == 0 || tmp == 1 || tmp == 2)
  238.                 setup.dpl_mode = tmp;
  239.             break;
  240.  
  241.           case cmd_btn:         /*  定速スクロールボタン速度  */
  242.             if (tmp > 0)
  243.                 setup.btn_speed = tmp;
  244.             break;
  245.  
  246.           case cmd_caps:        /*  大小文字の区別  */
  247.             if (tmp == 0 || tmp == 1)
  248.                 setup.caps = tmp;
  249.             break;
  250.  
  251.           case cmd_excmd:       /*  外部コマンド  */
  252.             p = prm2;
  253.             do {
  254.                 prm1 = p;
  255.                 p = skipbl(skipwd(prm1));
  256.             } while(*p != '\0' && *p != '#');
  257.             *(skipwd(prm1)) = '\0';
  258.             excmd_apend(prm2);
  259.             break;
  260.  
  261.           case cmd_onsei:       /*  ONSEI.DIC のパスリスト  */
  262.             *(skipwd(prm2)) = '\0';     /*  第二パラメータの終端セット  */
  263.             setup.onsei_dic = strdup(prm2);
  264.             break;
  265.  
  266.           case cmd_backpal:
  267.             cnv_palette(&setup.palette.back);
  268.             break;
  269.           case cmd_textpal:
  270.             cnv_palette(&setup.palette.text);
  271.             break;
  272.           case cmd_crpal:
  273.             cnv_palette(&setup.palette.cr);
  274.             break;
  275.           case cmd_ctrlpal:
  276.             cnv_palette(&setup.palette.ctrl);
  277.             break;
  278.         }
  279.     }
  280.  
  281.     fclose(fp);
  282. }
  283.  
  284.  
  285.  
  286.  
  287. /*  パラメータとしてファイルが指定されていたら、
  288.     そのドライブ・ディレクトリへ移動し、フルパスリストを作る  */
  289.  
  290. char    *param(char *file)
  291. {
  292. static  char    crrdir[256];
  293. REGS    char    *p, *fname;
  294.  
  295.     if (file == NULL || *file == '\0')          /*  空のファイル名  */
  296.         return NULL;
  297.  
  298.     if (isalpha(*file) && *(file+1) == ':')     /*  ドライブ名の指定  */
  299.     {
  300.         chdrv(toupper(*file) - 'A');
  301.         file += 2;
  302.     }
  303.  
  304.     if ((p = jstrrchr(file, '\\')) != NULL)     /*  ディレクトリ指定あり  */
  305.     {
  306.         if (p > file)       /*  ディレクトリ名だけを分離  */
  307.         {
  308.             *p = '\0';
  309.             chdir(file);
  310.         }
  311.         else                /*  ディレクトリ名はルート  */
  312.             chdir("\\");
  313.         fname = p + 1;
  314.     }
  315.     else                    /*  ディレクトリ指定なし  */
  316.         fname = file;
  317.  
  318.     getdir(crrdir);         /*  カレントまでのフルパス  */
  319.     strcat(crrdir, fname);  /*  カレントファイルのフルパスできあがり  */
  320.  
  321.     jstrupr(crrdir);
  322.  
  323.     return crrdir;
  324. }
  325.  
  326.  
  327.